<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
<HTML><HEAD>
<META http-equiv=Content-Type content="text/html; charset=windows-1252">
<META content="Microsoft FrontPage 6.0" name=GENERATOR></HEAD>
<BODY>
<H1>Universal Welcome</H1>
<H2>Background</H2>
<P>This document represents a description of a new welcome 
implementation that will be used by Eclipse products that want to promote contributions 
into the Welcome pages. The implementation will be provided by Eclipse platform 
and available for use and configuration.</P>
<H2>The Problem</H2>
<P>The Welcome framework in Eclipse provides for defining welcome pages with 
unique contribution points or 'anchors'. Other components can provide extensions 
that add content into these anchors. Although this mechanism worked well for 
closed solutions, it is increasingly hard to maintain for large products. Due to 
the 'bottom-up' nature of contributions from clients into the welcome pages, it 
is hard to control the final result and resolve conflicting contributions.</P>
<P>Take a provider of a reusable Eclipse feature as an example. He/she has 
created a useful feature consisting of a number of plug-ins. The feature can 
take part in several products, each one having its own Welcome implementation. 
There are several problems that the feature provider will face when creating 
Welcome contribution:</P>
<UL>
  <LI>Since it must contribute into a number of different products, the feature 
  must know about the page identifiers for each of the products upfront. 
  <LI>It is entirely possible that one of the products will have a Welcome 
  implementation that is completely different from what the feature provider 
  expects; the contribution will not show up in these products 
  <LI>Even if the products share a common Welcome implementation, the importance 
  of the feature (and hence its relative position on the page) is not going to 
  be the same. The feature can be one of the most important components in the 
  product, or may be ranked as 'See Also'. Nevertheless, the feature provider is 
  asked to fully spell out the location on the target page in advance. </LI></UL>
<P>It is clearly obvious that the Welcome contribution of a reusable feature 
would be much easier to develop with the following conditions in place:</P>
<UL>
  <LI>Common Welcome implementation that can be counted on (as a form of an API) 
  <LI>Delayed target page resolution (so that the decision of the final position 
  of the contribution is left to the product assemblers)</LI></UL>
<H2>The Solution</H2>
<P>Based on the conclusions made in the previous section, the User Assistance 
team now provides a recommended Welcome implementation that will be used by all products that want 
to support better Welcome control. Eclipse Platform and SDK products will switch 
to this implementation and others will be encouraged to follow suit.</P>
<P>The universal Welcome solution is based on our experience with Welcome 
implementations and the need to have an implementation in place that 
contributors can count on. The implementation is built using the current Welcome 
framework which has been minimally enhanced to better support it. For this 
reason, all existing Welcome implementation will continue to work and clients 
will be able to switch to the new model according to their schedules. Of course, as 
long as they don't switch, they will not reap the benefits of the new 
implementation such as intelligent content merging, new visual solution etc.</P>
<h3>Design Principles</h3>
<P>While designing the universal welcome implementation, we started from the 
following principles:</P>
<ol>
	<li>Products should be able to point at this implementation without 
	the need to implement Welcome from scratch</li>
	<li>Each product should be able to configure Welcome to a 
	certain degree (title, branding image, presentation theme)</li>
	<li>A number of root pages that cover most of the products' needs will be 
	provided. However, the list of pages to show will be 
	configurable.</li>
	<li>Visual design of the universal Welcome should be 
	sufficiently product-agnostic to better suit the increasingly componentized 
	world. It should work well with both monolithic products and 'best of bread' 
	Eclipse products composed of components created by different companies.</li>
	<li>End-users should also be able to configure universal Welcome in a user-friendly 
	way.</li>
</ol>
<H3>Hooking to the universal Welcome</H3>
<p>In order to hook to the universal Welcome, developers should have a 
product-based Eclipse application. This requires the use of the <b>
org.eclipse.runtime.products</b> extension point (the assumption is that the 
product has already been defined):</p>
<blockquote>
	<pre>&lt;extension
	id=&quot;foo&quot;
	point=&quot;org.eclipse.core.runtime.products&quot;&gt;
   &lt;product
      application=&quot;org.eclipse.ui.ide.workbench&quot;
      description=&quot;Product Foo to use for testing the universal intro&quot;
      name=&quot;Product Foo&quot;&gt;
   &lt;/product&gt;
&lt;/extension&gt;</pre>
</blockquote>
<p>For this example, assume that the extension is define in plugin.xml file 
sitting in the bundle with the bundle id of <b>com.example.intro</b>. A 
long-existing feature of the Eclipse intro support is the ability to hook 
products and intros using the product-intro binding:</p>
<blockquote>
	<pre>&lt;extension
	point=&quot;org.eclipse.ui.intro&quot;&gt;
   &lt;introProductBinding
      introId=&quot;org.eclipse.ui.intro.universal&quot;
      productId=&quot;com.example.intro.foo&quot;/&gt;
&lt;/extension&gt;</pre>
</blockquote>
<p>The extension above binds the universal intro implementation (<b>org.eclipse.ui.intro.universal</b>) 
and our product id.</p>
<p>Universal intro customization is split between product branding properties and 
preferences. Product branding properties are set by the product and cannot be 
modified. They include product title, branding image and branding image text:</p>
<pre>      &lt;product
            application=&quot;org.eclipse.ui.ide.workbench&quot;
            description=&quot;Product Foo to use for testing the universal intro&quot;
            name=&quot;Product Foo&quot;&gt;
         &lt;property
               name=&quot;introTitle&quot;
               value=&quot;Welcome to Product Bar&quot;/&gt;
         &lt;property
               name=&quot;introBrandingImage&quot;
               value=&quot;product:eclipse.png&quot;/&gt;
         &lt;property
       	       name=&quot;introBrandingImageText&quot;
               value=&quot;XYZ Company&quot;/&gt;
      &lt;/product&gt;</pre>
<p>Product properties whose values represent a file name relative to the product 
bundle must be qualified with the 'product:' prefix. The following properties are 
supported:</p>
<ul>
	<li><b>introTitle</b> - the value of the property will be used at the top of 
	the root page (assuming that the current presentation theme elected to show 
	the root page title)</li>
	<li><b>introBrandingImage</b> - the value of the property represents the 
	file name of the image to be used as the root page brand mark. The image 
	should ideally be PNG with alpha blending but other formats are also valid. 
	Image file names relative to the product bundle must have a 'product:' 
	prefix.</li>
	<li><b>introBrandingImageText</b> - an alternative text to be used for the 
	branding image.</li>
	<li><b>introDescription-&lt;pageId&gt;</b> - an option description text that 
	appears below the title on each of the sections, where pageId is one of the 
	values listed further below (e.g. introDescription-overview, 
	introDescription-samples etc.). This value should be translated in 
	plugin.properties file.</li>
</ul>
<p>Second half of universal intro variables are accessible as preferences. The 
split is due to the fact that these variables can be configured by users and are 
exposed in the new Welcome preference page. The initial values for these preferences 
should be placed in the 'plugin_customization.ini' file that is referenced from 
the product extension. These preferences are:</p>
<ul>
	<li><b>org.eclipse.ui.intro.universal/INTRO_ROOT_PAGES</b> - a comma-separated list of 
	root page identifiers that should be visible in the home page. Valid values 
	are:<ul>
		<li><b>overview</b></li>
		<li><b>firststeps</b></li>
		<li><b>tutorials</b></li>
		<li><b>samples</b></li>
		<li><b>whatsnew</b></li>
		<li><b>migrate</b></li>
		<li><b>webresources</b></li>
	</ul>
	</li>
	<li><b>org.eclipse.ui.intro.universal/INTRO_DATA</b> - a file name pointing at 
	the XML file with the page layout settings (see more about this below). The 
	file name relative to the product bundle must have 'product:' prefix.</li>
	<li><b>org.eclipse.ui.intro/INTRO_THEME</b> - a unique identifier of the 
	presentation theme to be used for this product (read more about theme 
	support in the <a href="#enhancements">section about Welcome framework 
	enhancements</a> below). <b>Note that this preference comes from 'org.eclipse.ui.intro 
	plug-in'</b> because active theme selection is performed at the framework 
	level.</li>
</ul>
<H3>Adding Welcome Customization preference page</H3>
<p>The combination of product properties and default preference values can fully 
configure the Universal Welcome if no further customization is desired. For 
products that want to allow users to customize Welcome, a preference page is 
available. The following code should be added to the product's plugin.xml:</p>
<pre>   &lt;extension
         point=&quot;org.eclipse.ui.preferencePages&quot;&gt;
      &lt;page
            category=&quot;org.eclipse.ui.preferencePages.Workbench&quot;
            class=&quot;org.eclipse.ui.intro.universal.ExtensionFactory:welcomeCustomization&quot;
            id=&quot;com.example.intro.introCustomization&quot;
            name=&quot;%introCustomizationPreference.name&quot;&gt;
         &lt;keywordReference id=&quot;org.eclipse.ui.ide.appearance&quot;/&gt;
      &lt;/page&gt;
   &lt;/extension&gt;</pre>
<p>This code will add the Welcome customization preference page:</p>
<p align="center">
<img border="0" src="home-page-prefs.png"></p>
<p align="left">The page allows users to select the presentation theme. The original choice is provided by the 
theme preference in the plugin_customization.ini file. In addition, users can choose from the list of available root pages. 
Checking the root page causes the related tab to appear at the top of the 
dialog.</p>
<p align="left">When saved, this preference page will prefix the variables with 
the product id so that it does not interfere with the settings made for other 
products in the same workbench. Alternatively, selecting the checkbox above will 
not prefix the variables, making the stored settings visible to all the 
products.</p>
<H3>Extending the Universal Welcome</H3>
<p>When launching the universal Welcome configured as shown above, you will notice 
that all of the second level page that branch off the root page have an empty 
content area. This is because shared Welcome does not have content of its own. 
These areas are populated using intro config extensions.</p>
<p>The traditional way of contributing config extensions is to specify a full 
path of the anchor element in the target page. This method is still supported 
but it has proven to be somewhat fragile. As mentioned before, specifying an 
exact place where the extension will end up in the target is premature for 
extension authors. They may not know all the products in which their extension 
will end up, and therefore don't know where they should appear according to each 
product's focus. In the universal Welcome, this decision is left to product 
authors. Extension authors now have the option of specifying an incomplete 
target path, allowing the product author to fill in the blanks.</p>
<p>Config extensions that want to use late target path resolution need to 
fulfill three conditions:</p>
<ol>
	<li>Config extension needs to specify a unique identifier using the 'id' 
	attribute. Extensions without the id will be ignored. This is important 
	because id will be used to refer to the extension by the product author.</li>
	<li>Config extension needs to specify a user-friendly name using the 'name' 
	attribute. This is important if the customization preference page will be 
	used because extensions will show up in the UI.</li>
	<li>The target path should have the following form: &quot;page_id/@&quot; where 'page_id' 
	is the identifier of the target page. When '/@' is detected in the target 
	path, an attempt will be made to dynamically resolve the path into the 
	expected full form.</li>
</ol>
<P>The ability to resolve extension target paths is a new intro support feature 
in Eclipse 3.2 added to make universal Welcome more powerful. The feature itself is 
generic in that it can be used in other Welcome implementations, not just the 
universal one. In Eclipse 3.2, CustomizableIntroPart can accept an optional intro customizer class that can affect its behavior in several ways. One of the roles 
of the customizer is to perform late target path resolution. Of course, as far 
as product authors are concerned, this is all just implementation detail because 
in universal Welcome implementation, late target path resolution is performed using 
the data file mentioned earlier. This file is stored using the org.eclipse.ui.intro/INTRO_DATA preference.</P>
<P>The 'INTRO_DATA' file uses XML format and allows product authors to control 
the content of the main Welcome pages. Welcome contribution authors are required 
to specify only the page Id in their target paths. The rest is defined in this 
file. The file contains a sequence of 'page' elements, each containing a number 
of 'group' elements. Group elements specify page-relative path and have 
contributions for children. Contribution elements are used to specify two 
aspects:&nbsp; </P>
<BLOCKQUOTE><PRE>&lt;extensions&gt;
   &lt;page id="overview"&gt;
      &lt;group path="page-content/top-left"&gt;
          &lt;extension id="foo1" importance=&quot;high&quot;/&gt;
          &lt;extension id="bar"  importance=&quot;high&quot;/&gt;
	  &lt;extension id=&quot;foo2&quot; importance=&quot;medium&quot;/&gt;
      &lt;/group&gt;
      &lt;group path="page-content/top-right"&gt;
           &lt;extension id="foo3" importance=&quot;low&quot;/&gt;
           &lt;extension id="foo4" importance=&quot;low&quot;/&gt;
           &lt;extension id=&quot;foo5&quot; importance=&quot;callout&quot;/&gt;
      &lt;/group&gt;
      &lt;hidden&gt;
            &lt;extension id="foo6"/&gt;
            &lt;extension id="foo7"/&gt;
      &lt;/hidden&gt;
   &lt;/page&gt;
   &lt;page id="whatsnew"&gt;
       ...
   &lt;/page&gt;
&lt;/extensions&gt;</PRE></BLOCKQUOTE>
<p>In the example above, contributions 'foo1', 'bar' and foo2' will be in the 
left, and 'foo3', 'foo4' and 'foo5' in the right column on the page. The 
relative order of contributions is also extracted from this file. In addition, 
contributions are classified based on the <code>importance</code> attribute that 
can have four valid values: <b>high</b>, <b>medium</b>, <b>low</b> and <b>
callout</b>, with <b>low</b> as the default. Each value has matching 
presentation that makes it stand out on the page. First three are simply 
different levels of importance according to the product author (note that the 
same contribution may receive a different importance classification in two 
separate products). The last one (<b>callout</b>) is used to single out 
contributions that are of a completely different nature (for example, a 
contribution that offers links to videos or animation).</p>
<p>Contributions that are not listed are appended after the listed contributions 
and assigned a low importance value. This is important for contributions added 
after the product has shipped - they still need to show up.</p>
<p>Contributions not relevant to the project can be hidden by explicitly listing 
them as children of the 'hidden' element.</p>
<h3>Contributing into extensions</h3>
<p>An extension contributed into one of the root pages can itself contain 
anchors, providing for others to add content. This causes a problem because the 
final resolved path of the content in the extension is not known in advance. For 
this reason, target paths for content in extensions that use late path 
resolution must itself be resolved:</p>
<blockquote>
	<pre>&lt;?xml version=&quot;1.0&quot; encoding=&quot;utf-8&quot; ?&gt;
&lt;introContent&gt;
   &lt;extensionContent id=&quot;extra&quot; name=&quot;Extra&quot; alt-style=&quot;css/swt.properties&quot; style=&quot;css/overview.css&quot; path=&quot;overview/@&quot;&gt;
      &lt;group id=&quot;extra-group&quot; style-id=&quot;content-group&quot;&gt;
         &lt;link label=&quot;Extra Overview link&quot; url=&quot;<a href="http://org.eclipse.ui.intro/showPage?id=extraOverview">http://org.eclipse.ui.intro/showPage?id=extraOverview</a>&quot; 
					  id=&quot;extra-overview&quot;&gt;
      	    &lt;text&gt;Showing the third-level extra page for overview&lt;/text&gt;
         &lt;/link&gt;
         &lt;anchor id=&quot;additions&quot;/&gt;
      &lt;/group&gt;
   &lt;/extensionContent&gt;
&lt;/introContent&gt;</pre>
</blockquote>
<p>In order to contribute into the anchor 'additions' in the extension above, we 
should use the following path: &quot;overview/@extra/extra-group/additions&quot;. The 
segment '@extra' will be replaced with the resolved path of the extension with 
the id 'extra' in the 'overview' page. For example, if the extension is placed 
in the upper left segment of the page, the resolved path will be: 
&quot;overview/page-content/upper-left/extra-group/additions&quot;.</p>
<h3>Seeding the introData file</h3>
<p>In addition to providing intro customization to the end users for the first 
time, Welcome preference page will allow product authors to create the 
introData.xml file to be used for the first startup. The procedure is simple:</p>
<ol>
	<li>Launch the product for the first time</li>
	<li>Open the Welcome preference page (a quick way to do this is from the 
	local tool bar of the Welcome view where a new tool bar button opens the 
	Preferences into the right page)</li>
	<li>For each page, manipulate the available extensions by moving them 
	between the four page quadrants (upper-left, upper-right, lower-left, 
	lower-right) and the Available list, or moving extensions up or down within 
	the same list (relative order). Use drag and drop to get the desired 
	results.</li>
	<li>If needed, add the separator between the extension within the quadrant.</li>
	<li>All extensions have the default importance setting of 'Low'. To change 
	it, click on the extension image to get the drop-down list to open and pick 
	a different setting from the list (e.g. High, Medium or Callout).</li>
	<li>Press OK to see the preferences applied to Welcome.</li>
	<li>If satisfied, open the preference page again and press 'Save As...' 
	button.</li>
	<li>Store the file as 'introData.xml' in the product plug-in.</li>
	<li>Set <b>org.eclipse.ui.intro.universal/INTRO_DATA</b> preference to the value 'product:introData.xml'.</li>
	<li>Start the product on a fresh workspace to test if the data from the file 
	has been picked up.</li>
</ol>
<H3 align="center">
<img border="0" src="page-prefs.png" width="707" height="545"></H3>
<p>List 'Available Extensions' holds all the extensions that are currently 
hidden. They can be moved to one of the four quadrants of each page.</p>
<H3>Handling multiple products</H3>
<p>The intent of the shared Welcome implementation is that all products that 
want intelligent content merging should point at it instead of creating their own 
Welcome. This 
implies that it is possible to end up in a situation where multiple products all 
pointing at the same shared Welcome coexist in the Eclipse workbench. Intro is 
handling this situation as follows:</p>
<ul>
	<li>Individual introData files associated with products in the workbench 
	will all be honored.</li>
	<li>Content from multiple products will be merged in the main Welcome pages. 
	When computing the location and importance of each extension, active product 
	data will be consulted first. Only when no information is found will other 
	product data be used. This implies that if the same extension XYZ is marked 
	as 'low importance' in the active product and 'high importance' in an 
	inactive product, the active product's setting will be used ('low'). On the 
	other hand, if XYZ is missing in the active product's data, but is marked as 
	'high importance' in an inactive product's data, 'high' setting will be 
	used.</li>
	<li>All the single-setting properties 
	(background, title, branding image) will be taken from the active product 
	only.</li>
	<li>Root pages to show (specified using the <b>org.eclipse.ui.intro/INTRO_ROOT_PAGES</b> 
	preference) will be computed as a union of root pages in all the products. An 
	attempt will be made to respect the order of root pages specified by the 
	active product. Pages missing in the active product's list but existing in 
	other products in the same workbench will be added at the most logical 
	place.</li>
</ul>
<p><font color="#800000">[Note: the above currently does not work - only active 
product intro data is consulted]</font></p>
<H3>Following links from the main Welcome pages</H3>
<p>Most of the extensions coming into the main Welcome pages offer links to open 
further pages contributed by the extensions themselves. It is recommended to 
create these pages in such a way as to continue with the shared Welcome visual 
design. The main requirement is to show the appropriate navigator at the top of 
the page.</p>
<p>It is fairly easy to do that using the 'include' element. The idea is to 
include the navigation content at the beginning of contributed page. Unlike the 
current Welcome implementation, shared Welcome main pages have navigation 
section that is different for each page. For this reason, pages that branch off 
these pages should include the navigation from the parent page. For example:</p>
<blockquote>
	<pre>&lt;?xml version=&quot;1.0&quot; encoding=&quot;utf-8&quot; ?&gt;
&lt;introContent&gt;
   &lt;extensionContent id=&quot;extra&quot; name=&quot;Extra&quot; alt-style=&quot;css/swt.properties&quot; style=&quot;css/overview.css&quot; path=&quot;overview/@&quot;&gt;
      &lt;link label=&quot;Extra Overview link&quot; url=&quot;<a href="http://org.eclipse.ui.intro/showPage?id=extraOverview">http://org.eclipse.ui.intro/showPage?id=extraOverview</a>&quot; 
					  id=&quot;extra-overview&quot;&gt;
      		&lt;text&gt;Showing the third-level extra page for overview&lt;/text&gt;
      &lt;/link&gt;
   &lt;/extensionContent&gt;
   &lt;page id=&quot;extraOverview&quot; <b>style=&quot;$theme$/html/overview.css&quot;</b> style-id=&quot;page&quot;&gt;
      <b>&lt;title style-id=&quot;intro-header&quot;&gt;$introTitle$&lt;/title&gt;</b>
      <b>&lt;group id=&quot;extra-group1&quot; filteredFrom=&quot;swt&quot;/&gt;</b>
      <b>&lt;include path=&quot;overview/navigation-links&quot;/&gt;</b>
      &lt;group id=&quot;page-content&quot;&gt;
            &lt;group id=&quot;content-header&quot; label=&quot;EXTRA OVERVIEW&quot; filteredFrom=&quot;swt&quot;&gt;
            &lt;/group&gt;
            &lt;text style-id=&quot;page-title&quot; id=&quot;page-title&quot; filteredFrom=&quot;html&quot;&gt;EXTRA OVERVIEW&lt;/text&gt;
            &lt;text style-id=&quot;page-description&quot; id=&quot;page-description&quot;&gt;Extra overview page description.&lt;/text&gt;
	    &lt;!-- Add content here --&gt;
      &lt;/group&gt;
   &lt;/page&gt;
&lt;/introContent&gt;</pre>
</blockquote>
<p>The extension above contributed into the overview page contributes a link 
that shows another page whose definition is part of the extension. Note how we 
define the title element using substitution variable (the variable will be 
resolved based on the product property). We also include the group 'navigation-links' that belongs to the 'overview' page at the 
beginning of the page content definition. We also add the 'extra-group1' div 
because it is can be used by some themes for adding additional page decoration 
(indeed, it is used in 'Purple Mesh' theme for that exact purpose).</p>
<h2><a name="enhancements"></a>Enhancements of the Welcome framework in 3.2</h2>
<p>In order to make universal welcome possible, we made a number of enhancements 
in the 
Welcome framework. These enhancements are of general nature and are are 
applicable to other Welcome implementations:</p>
<ul>
	<li><b>configurer</b> attribute added to config element in 
	'org.eclipse.ui.intro.config' extension point. The variable allows for 
	plugging in an optional configurer that extends <b>
	org.eclipse.ui.intro.config.IntroCofigurer</b> abstract class. This supports 
	provides for computed group content, substitution variables, target path 
	resolution etc.</li>
	<li><b>computed</b> attribute added to the <code>group</code> element in 
	the intro content schema. This attribute indicates that the children of the 
	group will be dynamically computed by the intro configurer.</li>
	<li><b>computed</b> attribute added to the <code>launchBar</code> element in 
	the <b>org.eclipse.ui.intro.config </b>extension point. When true, the 
	shortcuts will be computed by the intro configurer.</li>
	<li><b>bgImage</b> attribute added to the <code>group</code> and <code>page</code> 
	elements in the intro content schema. It provides for setting the background 
	image on these elements.</li>
	<li><b>id</b> and <b>name</b> attributes added to the extensionContent 
	element in the intro content schema (see above for explanation).</li>
	<li><b>expandable</b> boolean attribute added to the <code>group</code> 
	element. If <code>true</code>, the group will have the ability to expand and 
	collapse its children by selecting the title and/or the toggle button.</li>
	<li>new element <b>hr</b> to be used for horizontal separators in the 
	content. Separator style is controlled by the active theme.</li>
</ul>
<h4>Welcome Themes</h4>
<p>New in 3.2 is support for Welcome themes. Themes can be plugged is using the 
new element that is part of org.eclipse.ui.intro.configExtension extension 
point. Plug-in org.eclipse.ui.intro.universal plugs in two themes:</p>
<pre>   &lt;extension
         point=&quot;org.eclipse.ui.intro.configExtension&quot;&gt;
      &lt;theme
            default=&quot;true&quot;
            id=&quot;org.eclipse.ui.intro.universal.circles&quot;
            name=&quot;%theme.name.circles&quot;
            path=&quot;$nl$/themes/circles&quot;
            previewImage=&quot;themes/circles/preview.png&quot;&gt;
            &lt;property name=&quot;launchbarBackground&quot;
            		value=&quot;#a1c2cb&quot;/&gt;
            &lt;property name=&quot;launchbarOverviewIcon&quot;
            		  value=&quot;$theme$graphics/launchbar/overview16.png&quot;/&gt;
            &lt;property name=&quot;launchbarFirststepsIcon&quot;
            		  value=&quot;$theme$graphics/launchbar/firststeps16.png&quot;/&gt;
            &lt;property name=&quot;launchbarTutorialsIcon&quot;
            		  value=&quot;$theme$graphics/launchbar/tutorials16.png&quot;/&gt;
            &lt;property name=&quot;launchbarSamplesIcon&quot;
            		  value=&quot;$theme$graphics/launchbar/samples16.png&quot;/&gt;
            &lt;property name=&quot;launchbarWhatsnewIcon&quot;
            		  value=&quot;$theme$graphics/launchbar/whatsnew16.png&quot;/&gt;
            &lt;property name=&quot;launchbarMigrateIcon&quot;
            		  value=&quot;$theme$graphics/launchbar/migrate16.png&quot;/&gt;
            &lt;property name=&quot;launchbarWebresourcesIcon&quot;
            		  value=&quot;$theme$graphics/launchbar/webresources16.png&quot;/&gt;
      &lt;/theme&gt;
      &lt;theme
            id=&quot;org.eclipse.ui.intro.universal.purpleMesh&quot;
            name=&quot;%theme.name.purpleMesh&quot;
            path=&quot;$nl$/themes/purpleMesh&quot;
            previewImage=&quot;themes/purpleMesh/preview.png&quot;&gt;
            &lt;property name=&quot;launchbarBackground&quot;
            		value=&quot;#c6c3e8&quot;/&gt;
            &lt;property name=&quot;launchbarOverviewIcon&quot;
            		  value=&quot;$theme$graphics/launchbar/overview.gif&quot;/&gt;
            &lt;property name=&quot;launchbarFirststepsIcon&quot;
            		  value=&quot;$theme$graphics/launchbar/firststeps16.png&quot;/&gt;
            &lt;property name=&quot;launchbarTutorialsIcon&quot;
            		  value=&quot;$theme$graphics/launchbar/tutorials.gif&quot;/&gt;
            &lt;property name=&quot;launchbarSamplesIcon&quot;
            		  value=&quot;$theme$graphics/launchbar/samples.gif&quot;/&gt;
            &lt;property name=&quot;launchbarWhatsnewIcon&quot;
            		  value=&quot;$theme$graphics/launchbar/whatsnew.gif&quot;/&gt;
            &lt;property name=&quot;launchbarMigrateIcon&quot;
            		  value=&quot;$theme$graphics/launchbar/migrate16.png&quot;/&gt;
            &lt;property name=&quot;launchbarWebresourcesIcon&quot;
            		  value=&quot;$theme$graphics/launchbar/webresources16.png&quot;/&gt;
      &lt;/theme&gt;
   &lt;/extension&gt;</pre>
<p>Each theme has a unique identifier, translatable name, preview image and a 
path to the root theme folder. Intro plug-in does not provide any UI for theme 
manipulation. The only way to select a theme is via the preference 
org.eclipse.ui.intro/INTRO_THEME in plugin_customization.ini. </p>
<p>Theme support by itself does not make intro implementations theme-enabled. It 
is simply a way of grouping all the presentation files (styles and images) in 
one place that can be pointed at or switched as one. Concrete intro 
implementations can choose to expose themes in a more substantial way (and in 
fact Universal Welcome implementation does exactly that).</p>
<p>Theme-enabled intro implementation must make all the references to style and 
presentation resources using the $theme$ substitution variable. Absolute paths 
for images, pages, styles etc. will be computed by resolving the substitution 
variable using the path of the currently active theme.</p>
<p>&nbsp;</p>

</BODY></HTML>
